/*
 * Progetto PPS2012 - seegwords
 *
 * Ettore Chimenti
 * Giuliano De Angelis
 * 
 * @02.2013
 * 
 * 4) Realizzare un mini motore di ricerca, implementato attraverso una lista inversa:
 * http://en.wikipedia.org/wiki/Inverted_index
 * 
 * Leggere un insieme di documenti .txt da una directory. Si crei una classe MotoreDiRicerca che 
 * permette di effettuare ricerche efficienti realizzando una lista inversa.
 * In particolare, la classe prende i documenti e crea una la lista inversa:
 * parola->lista_documenti_che_la_contengono
 * 
 * Implementare un metodo Search che prende in ingresso una stringa e ritorna un vettore di documenti.
 * In particolare, il metodo Search separa la stringa in un insieme di parole. I documenti ritornati 
 * sono trovati intersecando le liste relative alle parole. 
 * 
 */

#ifndef MOTOREDIRICERCA_H
#define MOTOREDIRICERCA_H
#include<map>
#include<set>
#include<list>
#include<string>
#include<vector>
#include "./Word.h"

class Word;

class MotoreDiRicerca {
private:
  class pos {
  public:
    int 	document;
    int 	position; 
    pos(int i_, int k_): document(i_), position(k_) {};
  };
  
  std::vector	<std::string>	   	doc_names;
  std::multimap	<std::string, pos> 	db;
  bool 				   	name_search;	//TODO: cercare anche nel nome del file
  
  bool 					ScanFile	(const std::string&		 file,
							 const int& 			 i);	
  bool 					ScanDir		(const std::string&  		 arg, 	
							       std::vector<std::string>* doc_names_);

  std::set<int>*		 	Find		(const std::vector<std::string>& query)		const;
  std::set<int>*			Find_Mono	(const std::string& 		 query)		const;
  std::set<int>*			Find_Multi	(const std::vector<std::string>& query)		const;
  
  std::list<Word*>* 			Parser		(const std::string& 		 query)		const;
  std::vector<std::string>* 		Int2NameFile	(const std::set<int>& 		 int_docs)	const;

public:
  bool 					Index		(const std::vector<std::string>& doc_names_);
  std::vector<std::string>* 		Search		(const std::string& 		 query)		const;
  unsigned int 				GetDbSize	()						const;
  unsigned int				GetDocSize	()						const;
};			

#endif